package modules.user.entity;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;


/**
 * 我的关注
 * 
 * @author langhsu
 * 
 */
@Entity
@Table(name="mto_follows")
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
/*
 * CacheConcurrencyStrategy有五种缓存方式：
 * CacheConcurrencyStrategy.NONE，不适用，默认
 * CacheConcurrencyStrategy.READ_ONLY ，只读模式，在此模式下，如果对数据进行更新操作，会有异常；
 * CacheConcurrencyStrategy.READ_WRITE ，读写模式在更新缓存的时候会把缓存里面的数据换成一个锁，
 *  其它事务如果去取相应的缓存数据，发现被锁了，直接就去数据库查询；
 * CacheConcurrencyStrategy.NONSTRICT_READ_WRITE ，不严格的读写模式则不会的缓存数据加锁；
 * CacheConcurrencyStrategy.TRANSACTIONAL ，事务模式指缓存支持事务，当事务回滚时，缓存也能回滚，只支持 JTA 环境。
 */
public class Follow {
	
	@Id//主键
	@GeneratedValue(strategy=GenerationType.IDENTITY)//主键自增，采用MySQL数据库的机制
	private long id;
	
	/**
	 * 所属用户Id
	 */
	@ManyToOne
	@JoinColumn(name="user_id",nullable=false)
	/*
	 * 与@Column用法相同，区别是@JoinColumn作用的属性必须是实体类；nullable：是否可以为空
	 */
	private User user;
	
	/**
	 * 关注用户Id
	 */
	@ManyToOne
	@JoinColumn(name="follow_id",nullable=false)
	private User follow;
	
	/*
	 * 数据库的字段类型有date、time、datetime
	 * 而Temporal注解的作用就是帮Java的Date类型进行格式化，一共有三种注解值：
	 * 第一种：@Temporal(TemporalType.DATE)——>实体类会封装成日期“yyyy-MM-dd”的 Date类型。
	 * 第二种：@Temporal(TemporalType.TIME)——>实体类会封装成时间“hh-MM-ss”的 Date类型。
	 * 第三种：@Temporal(TemporalType.TIMESTAMP)——>实体类会封装成完整的时间“yyyy-MM-dd hh:MM:ss”的 Date类型。
	 */
	@Temporal(TemporalType.TIMESTAMP)
	private Date created;

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public User getFollow() {
		return follow;
	}

	public void setFollow(User follow) {
		this.follow = follow;
	}

	public Date getCreated() {
		return created;
	}

	public void setCreated(Date created) {
		this.created = created;
	}
}
